﻿using System;
using System.Collections.Generic;
using Demo.Services.Services.Impl.Managers;
using Demo.Services.Contracts.DTO.Infos;
using Demo.CommonBase.Logging;
using Demo.CommonBase.Exceptions;
using System.Reflection;
using Ext.Net;
using Demo.CommonBase.View.Forms;

namespace Demo.Web.Catalogs
{
    public partial class ProjectEdit : PageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                int id = 0;                
                if (Request["Id"] != null)
                {
                    id = Convert.ToInt32(Request["Id"]);
                    SetEditData(id);
                }
                else
                {
                    Session["AssignedTecnologies"] = null;
                    Session["AssignedAreas"] = null;                    
                    LoadUnAssignedTecnologies(id);
                    LoadUnAssignedAreas(id);
                }
            }
        }
        private void SetEditData(int id)
        {
            ProyectManager proyectManager;
            ProyectInfo proyectInfo;

            try
            {
                Logger.Info();
                proyectManager = new ProyectManager();
                proyectInfo = proyectManager.GetProyectById(id);
                txtProjectId.Text = proyectInfo.Id.ToString();
                txtName.Text = proyectInfo.Name;
                txtDateStart.SetValue(proyectInfo.DateStart);
                txtDateEnd.SetValue(proyectInfo.DateEnd);
                txtHours.Text = proyectInfo.Hours.ToString();
                cboStatus.Select(proyectInfo.StatusId.ToString());
                LoadAssigned(proyectInfo);
                LoadUnAssignedAreas(proyectInfo.Id);
                LoadUnAssignedTecnologies(proyectInfo.Id);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
        }
        protected void AssignArea(object sender, DirectEventArgs e)
        {
            WindowArea.ShowWindow();
        }
        protected void AssigTecnologies(object sender, DirectEventArgs e)
        {
            WindowTecnology.ShowWindow();
        }
        

        protected void Guardar(object sender, DirectEventArgs e)
        {
            ProyectManager proyectManager;
            ProyectInfo proyectInfo;
            try
            {
                proyectInfo = GetData();

                proyectManager = new ProyectManager();
                proyectManager.SaveProyect(proyectInfo);
                ExtNet.Js.AddScript("parentAutoLoadControl.hide();");
                ExtNet.Js.AddScript("parent.Ext.getCmp('btnRefresh').fireEvent('click');");
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }

        }
        private ProyectInfo GetData()
        {
            var project = new ProyectInfo();
            project.Id = txtProjectId.Text == string.Empty ? 0 : Convert.ToInt32(txtProjectId.Text);
            project.Name = txtName.Text;
            project.DateStart = txtDateStart.SelectedValue == null ? string.Empty : GetFormatDate(txtDateStart.SelectedValue.ToString());
            project.DateEnd = txtDateEnd.SelectedValue == null ? string.Empty : GetFormatDate(txtDateEnd.SelectedValue.ToString());
            project.Hours = Convert.ToInt32(txtHours.Text);
            project.StatusId = Convert.ToInt32(cboStatus.SelectedItem.Value);
            if (Session["AssignedTecnologies"] != null)
            {
                List<TecnologyInfo> tecnologyList = (List<TecnologyInfo>)Session["AssignedTecnologies"];
                project.TecnologyList = tecnologyList;
            }
            if (Session["AssignedAreas"] != null)
            {
                List<AreaInfo> areaList = (List<AreaInfo>)Session["AssignedAreas"];
                project.AreaList = areaList;
            }
            return project;
        }
        private void LoadUnAssignedTecnologies(int id)
        {
            ProyectManager projectManager;            
            List<TecnologyInfo> unAssignedTecnologyList;
            try
            {
                Logger.Info();
                projectManager = new ProyectManager();
                unAssignedTecnologyList = projectManager.GetUnAssignedTecnologies(id);
                Session["UnAssignedTecnologies"] = unAssignedTecnologyList;               
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
        }
        private void LoadUnAssignedAreas(int id)
        {
            ProyectManager projectManager;
            List<AreaInfo> unAssignedArea;
            try
            {
                Logger.Info();
                projectManager = new ProyectManager();
                unAssignedArea = projectManager.GetUnAssignedAreas(id);
                Session["UnAssignedAreas"] = unAssignedArea;

            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
        }
        private void LoadAssigned(ProyectInfo projectInfo)
        {           
            try
            {
                Logger.Info();
                Session["AssignedTecnologies"] = projectInfo.TecnologyList;
                Session["AssignedAreas"] = projectInfo.AreaList;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
        }
        protected void CheckName(object sender, RemoteValidationEventArgs e)
        {
            int id = txtProjectId.Text == string.Empty ? 0 : Convert.ToInt32(txtProjectId.Text);
            var name = (TextField)sender;
            var proyectManager = new ProyectManager();
            bool isValid = proyectManager.CheckName(id, name.Text);


            if (isValid)
            {
                e.Success = true;
            }
            else
            {
                e.Success = false;
                e.ErrorMessage = "Nombre de Proyecto Existente";
            }

            System.Threading.Thread.Sleep(1000);
        }
    }
}